package com.anlu.yue.model;

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class ResultData<T> {

    private Integer code;
    private String msg;

    private T data;


    private static<T> ResultData<T> makeResult(Integer code, String msg, T data) {
        ResultData<T> result = new ResultData<T>();
        result.setCode(code);
        result.setMsg(msg);
        if (data != null) {
            result.setData(data);
        }
        return result;
    }

    public static <T> ResultData<T> success() {
        return makeResult(SuperResultCodeUtil.SUCCESS.getCode(), SuperResultCodeUtil.SUCCESS.getMsg(), null);
    }

    /**
     * 构造成功的包体
     *
     * @param data 包体中data的内容
     * @return 成功的包体
     */
    public static <T> ResultData <T> success(T data) {
        return makeResult(SuperResultCodeUtil.SUCCESS.getCode(), SuperResultCodeUtil.SUCCESS.getMsg(), data);
    }


    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @return 失败的包体
     */
    public static ResultData error(SuperCodeMsg result) {
        return makeResult(result.getCode(), result.getMsg(), null);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @param data   包体内容
     * @return 失败的包体
     */
    public static<T> ResultData <T> error(SuperCodeMsg result, T data) {
        return makeResult(result.getCode(), result.getMsg(), data);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @return 失败的包体
     */
    public static ResultData error(SuperCodeMsg result, String msg) {
        return makeResult(result.getCode(), msg, null);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @param data   包体内容
     * @return 失败的包体
     */
    public static<T> ResultData <T> error(SuperCodeMsg result, String msg, T data) {
        return makeResult(result.getCode(), msg, data);
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
